﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using HerGoS.Viaticos.Entities;
using HerGoS.Viaticos.Engine;
using HerGoS.ControlsUI;
using HerGoS.Administration.Engine;
using HerGoS.Administration.Entities;
using HerGoS.Interfaces;
using HerGoS.WebControlExtend;
using System.Web.Services;

namespace HerGoS.WebUI.Viaticos.Rendiciones
{
    public partial class Rendicion_ABM : PageBase
    {

        [WebMethod]
        public static bool HabilitarKmRecorridos(int idtransporte)
        {
            List<Transporte> listaTransporte = HttpContext.Current.Session["TipoTransporteRendicion"] as List<Transporte>;

            var result = listaTransporte.Find(y => y.OID == idtransporte);

            return result.CALCULOKMS;

        }


        #region Propiedades

        public Rendicion Rendicion
        {
            get
            {
                if (ViewState["rendicion"] != null)
                    return (Rendicion)ViewState["rendicion"];
                return null;
            }
            set
            {
                ViewState["rendicion"] = value;
            }

        }
       
        public int Contador
        {
            get
            {
                if (ViewState["contador"] != null)
                    return (int)ViewState["contador"];
                return 0;
            }
            set
            {
                ViewState["contador"] = value;
            }
        }
        #endregion


        protected void Page_Load(object sender, EventArgs e)
        {
            Page.MaintainScrollPositionOnPostBack = true;
           
            if (!Page.IsPostBack)
            {
                
                this.cboSolicitudes.DataSource = GestorSolicitudes.SolicitudesSinRendicion();
                cboSolicitudes.DataTextField = "Numero";
                cboSolicitudes.DataValueField = "OID";
                cboSolicitudes.DataBind();
                cboSolicitudes.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));


                if (Request.QueryString["id"] == null)
                {
                  
                    Rendicion = new Rendicion();
                    if (Request.QueryString["solicitudid"] != null)
                    {
                       string solicitudId = Request.QueryString["solicitudid"];

                        cboSolicitudes.SelectedValue = solicitudId;
                        cboSolicitudes.Load+=new EventHandler(cboSolicitudes_SelectedIndexChanged); 
                    
                    }

                    //this.btnLiquidacion.Visible = Rendicion.OID!=0;
                    this.btnLiquidacion.Visible = Rendicion.OID != 0;
                    this.lblLiquidacionExistente.Visible = GestorRendicion.RendicionTieneLiquidacion(Rendicion); 
                }
                else
                {
                    
                    var Id = Convert.ToInt32(Request.QueryString["id"]);
                    Rendicion = GestorRendicion.Obtener(Id);
                    cboSolicitudes.SelectedValue = Rendicion.SolicitudRendida.OID.ToString();
                    this.txtNumeroRendicion.Text = Rendicion.NumeroRendicion.ToString();
                    this.txtNumero.Text = Rendicion.SolicitudRendida.Numero.ToString();
                    txtDNI.Text = Rendicion.Persona.DNI;
                    txtApyNombre.Text = Rendicion.Persona.NombresYApellidos;
                    txtCuit.Text = Rendicion.Persona.Cuit;
                    txtFechaNac.Text = Rendicion.Persona.FechaNacimiento == null? null:Rendicion.Persona.FechaNacimiento.Value.ToShortDateString();
                    this.cboArea.SelectedValue = Rendicion.SolicitudRendida.Area == null ? "0" : Rendicion.SolicitudRendida.Area.OID.ToString();
                    this.cboEntidad.SelectedValue = Rendicion.SolicitudRendida.Entidad == null ? "0" : Rendicion.SolicitudRendida.Entidad.OID.ToString(); ;
                    this.txtFechaSalida.Text = Rendicion.SolicitudRendida.FechaSalida.Value.ToShortDateString();
                    this.txtFechaRetorno.Text = Rendicion.SolicitudRendida.FechaRetorno.Value.ToShortDateString();
                    this.txtObservacion.Text = Rendicion.Observaciones;
                    this.txtObjetivo.Text = Rendicion.ObjetivoViaje;
                    LoadCombos();
                    this.cboDistancia.SelectedValue = Rendicion.Distancia == null ? "0" : Rendicion.Distancia.OID.ToString();
                    LoadGridTramos(true);
                    this.UpdatePanelTramos.Update();

                    this.cboSolicitudes.Enabled = false;
                    this.btnLiquidacion.Visible =  !GestorRendicion.RendicionTieneLiquidacion(Rendicion);
                    lblLiquidacionExistente.Visible = GestorRendicion.RendicionTieneLiquidacion(Rendicion);
                }
                Initialize();
            }

        }

        void Initialize()
        {
            this.btnGuardar.Settings(new ButtonExtText());
            this.btnCerrar.Settings(new ButtonExtText());

            this.GridTramos.Settings(new GridViewExtBasic());
            this.GridTramos.AllowPaging = false;
            this.btn_AgregarTramo.Settings(new ButtonExtText());
            this.btnLiquidacion.Settings(new ButtonExtText());
            this.btn_Cerrar_dialog_tramo.Settings(new ButtonExtText());
            this.btn_DialogTramos.Settings(new ButtonExtText());
            
            LoadAutoria(Rendicion);
        }

        private void LoadGridTramos(bool cache)
        {
            GridTramos.DataSource = GestorTramo.Activos(Rendicion);
            GridTramos.DataBind();
        }

        private void LoadCombos()
        {
            this.cboArea.DataSource = GestorArea.Consultar();
            cboArea.DataTextField = "Descripcion";
            cboArea.DataValueField = "OID";
            cboArea.DataBind();
            cboArea.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

            this.cboEntidad.DataSource = GestorEntidades.Consultar();
            cboEntidad.DataTextField = "Denominacion";
            cboEntidad.DataValueField = "OID";
            cboEntidad.DataBind();
            cboEntidad.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

            var ListaTransporte = new List<Transporte>();
            ListaTransporte = GestorTransporte.Consultar();
            //Session["TipoTransporteRendicion"] = ListaTransporte;

            this.cbTransporte.DataSource = ListaTransporte;
            cbTransporte.DataTextField = "Descripcion";
            cbTransporte.DataValueField = "OID";
            cbTransporte.DataBind();
            cbTransporte.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

            this.cboPorcViatico.DataSource = GestorViaticos.ConsultarPorcentajeViatico();
            this.cboPorcViatico.DataTextField = "Valor";
            this.cboPorcViatico.DataValueField = "Valor";
            cboPorcViatico.DataBind();
          


            this.cboCiudad.DataSource = GestorCiudad.Consultar();
            cboCiudad.DataTextField = "Nombre";
            cboCiudad.DataValueField = "OID";
            cboCiudad.DataBind();
            cboCiudad.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));


            this.cboCiudadDestino.DataSource = GestorCiudad.Consultar();
            cboCiudadDestino.DataTextField = "Nombre";
            cboCiudadDestino.DataValueField = "OID";
            cboCiudadDestino.DataBind();
            cboCiudadDestino.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

            this.cboDistancia.DataSource = GestorDistancia.Consultar();
            this.cboDistancia.DataTextField = "Descripcion";
            this.cboDistancia.DataValueField = "OID";
            cboDistancia.DataBind();
            cboDistancia.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));



        }

        protected void cboSolicitudes_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadCombos();
            
            Solicitud solicitudSelected = GestorSolicitudes.Obtener(cboSolicitudes.SelectedValue.ToInteger());
            Rendicion.SolicitudRendida = solicitudSelected;

             //  carga de solicitud
            txtNumero.Text = solicitudSelected.Numero.ToString();
            
            Persona persona = solicitudSelected.Persona;
            txtDNI.Text = persona.DNI;
            txtApyNombre.Text = persona.NombresYApellidos;
            txtCuit.Text = persona.Cuit;
            txtFechaNac.Text = persona.FechaNacimiento== null ? null : persona.FechaNacimiento.Value.ToShortDateString();

            this.cboArea.SelectedValue = solicitudSelected.Area == null ? "0" : solicitudSelected.Area.OID.ToString();
            this.cboEntidad.SelectedValue = solicitudSelected.Entidad == null ? "0" : solicitudSelected.Entidad.OID.ToString(); ;
            this.txtFechaSalida.Text = solicitudSelected.FechaSalida.Value.ToShortDateString();
            this.txtFechaRetorno.Text = solicitudSelected.FechaRetorno.Value.ToShortDateString();
            this.cboDistancia.SelectedValue = solicitudSelected.Distancia == null ? "0" : solicitudSelected.Distancia.OID.ToString();
            this.txtObservacion.Text = solicitudSelected.Observaciones;
            

            Rendicion.Tramos = Rendicion.SolicitudRendida.Clone();
   
             LoadGridTramos(true);
            Rendicion.Persona = solicitudSelected.Persona;
            
            this.UpdatePanelTramos.Update();
            this.UpdateObservacion.Update();
           


        }


        protected void btn_AgregarTramo_Click(object sender, EventArgs e)
        {
            try
            {
                int idtramo = hidIdTramo.Value.ToInteger();
                if (idtramo != 0)
                {
                   foreach (var item in Rendicion.Tramos.Where(x => x.OID == idtramo))
                    {
                        item.Transporte = GestorTransporte.Obtener(this.cbTransporte.SelectedValue.ToInteger());
                        item.PorcentajeViatico = Convert.ToDecimal(cboPorcViatico.SelectedValue);
                        item.CiudadOrigen = GestorCiudad.Obtener(this.cboCiudad.SelectedValue.ToInteger());
                        item.FechaOrigen = Convert.ToDateTime(txtFechaOrigen.Text + " " + txtHora.Text);
                        item.NroServicioOrigen = this.txtNroServicioOrigen.Text;
                        item.CodigoOrigen = this.txtCodigoOrigen.Text;
                        item.ObservacionOrigen = txtObservacionOrigen.Text;
                        item.CiudadDestino = GestorCiudad.Obtener(cboCiudadDestino.SelectedValue.ToInteger());
                        item.FechaDestino = Convert.ToDateTime(this.txtFechaDestino.Text + " " + this.txtHoraDestino.Text);
                        item.ObservacionDestino = this.txtObservacionesDestino.Text;

                        item.MontoTerminalOrigenIda = item.CiudadOrigen.TarifaTerminal;
                        item.MontoTerminalDestinoIda = item.CiudadDestino.TarifaTerminal;
                        item.TarifaDiariaDestino = item.CiudadDestino.TarifaViatico;

                        item.kmRecorridos = this.txtKmRecorridos.Text == string.Empty ? 0 : Convert.ToDecimal(txtKmRecorridos.Text);
                    }

                    LoadGridTramos(true);
                    idtramo = 0;
                }
                else
                {
                    Tramo tramo = new Tramo();
                    tramo.Transporte = GestorTransporte.Obtener(this.cbTransporte.SelectedValue.ToInteger());
                    tramo.PorcentajeViatico = Convert.ToDecimal(cboPorcViatico.SelectedValue) ;
                    tramo.CiudadOrigen = GestorCiudad.Obtener(this.cboCiudad.SelectedValue.ToInteger());
                    tramo.FechaOrigen = Convert.ToDateTime(txtFechaOrigen.Text + " " + txtHora.Text);
                    tramo.NroServicioOrigen = this.txtNroServicioOrigen.Text;
                    tramo.CodigoOrigen = this.txtCodigoOrigen.Text;
                    tramo.ObservacionOrigen = txtObservacionOrigen.Text;
                    tramo.CiudadDestino = GestorCiudad.Obtener(cboCiudadDestino.SelectedValue.ToInteger());
                    tramo.FechaDestino = Convert.ToDateTime(this.txtFechaDestino.Text + " " + this.txtHoraDestino.Text);
                    tramo.ObservacionDestino = this.txtObservacionesDestino.Text;
                    tramo.kmRecorridos = this.txtKmRecorridos.Text == string.Empty ? 0 : Convert.ToDecimal(txtKmRecorridos.Text);
                    tramo.MontoTerminalOrigenIda = tramo.CiudadOrigen.TarifaTerminal;
                    tramo.MontoTerminalDestinoIda = tramo.CiudadDestino.TarifaTerminal;
                    tramo.TarifaDiariaDestino = tramo.CiudadDestino.TarifaViatico;
  
                    Contador = Contador - 1;
                    tramo.OID = Contador;
                    Rendicion.Tramos.Add(tramo);
                    LoadGridTramos(true);
                }

                this.cbTransporte.SelectedValue = "0";
                this.cboPorcViatico.SelectedValue = "0";
                this.cboCiudad.SelectedValue = "0";
                this.txtFechaOrigen.Text = string.Empty;
                this.txtHora.Text = string.Empty;
                this.txtNroServicioOrigen.Text = string.Empty;
                this.txtCodigoOrigen.Text = string.Empty;
                this.txtObservacionOrigen.Text = string.Empty;
                this.cboCiudadDestino.SelectedValue = "0";
                this.txtFechaDestino.Text = string.Empty;
                this.txtHoraDestino.Text = string.Empty;
                this.txtObservacionesDestino.Text = string.Empty;
                this.txtKmRecorridos.Text = string.Empty;
            }

            catch (Exception ex)
            { }


        }
        
        
        
        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                               
                Rendicion.Area = GestorArea.Obtener(cboArea.SelectedValue.ToInteger());
                Rendicion.Entidad = GestorEntidades.Obtener(cboEntidad.SelectedValue.ToInteger());
                Rendicion.Distancia = GestorDistancia.Obtener(this.cboDistancia.SelectedValue.ToInteger());
                Rendicion.FechaSalida = this.txtFechaSalida.Text.ToNullableDateTime();
                Rendicion.FechaRetorno = this.txtFechaRetorno.Text.ToNullableDateTime();
                Rendicion.Observaciones =  this.txtObservacion.Text;
                Rendicion.ObjetivoViaje = this.txtObjetivo.Text;

               
                GestorRendicion.Guardar(Rendicion);
                Rendicion = GestorRendicion.Obtener(Rendicion.OID);
                this.txtNumeroRendicion.Text = Rendicion.NumeroRendicion.ToString();
               
                var numero = this.txtNumeroRendicion.Text;
                string script = @"$(function(){{parent.IntervaloCerrarPopup('{0}');}});";
                this.btnLiquidacion.Visible = !GestorRendicion.RendicionTieneLiquidacion(Rendicion);
                script = string.Format(script, numero);
                Contador = 0;
                ScriptManager.RegisterStartupScript(Page, typeof(Page), "closedialog", script, true);
            }

            catch (Exception ex)
            { }


        }
        protected void GridTramos_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Borrar")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                int id = Convert.ToInt32(GridTramos.DataKeys[index].Value);


                if (id > 0)
                {
                    Tramo tramo = Rendicion.Tramos.Where(x => x.OID == id).FirstOrDefault();
                    tramo.Persistencia = EstadoPersistencia.DELETE;

                }
                else
                {
                    Rendicion.Tramos.RemoveAt(index);

                }
                LoadGridTramos(true);
            }
            if (e.CommandName == "Editar")
            { 
                  int index = Convert.ToInt32(e.CommandArgument);
                  int oid = Convert.ToInt32(GridTramos.DataKeys[index].Value);
                
                  hidIdTramo.Value = oid.ToString();
                  Tramo tramo;
                  tramo = Rendicion.Tramos.Find(y => y.OID == oid);

                  this.cbTransporte.SelectedValue = tramo.Transporte.OID.ToString();
                  this.cboPorcViatico.SelectedValue = tramo.PorcentajeViatico == 0 ? "0" : Convert.ToString(tramo.PorcentajeViatico);
                  cboCiudad.SelectedValue = tramo.CiudadOrigen == null ? "0" : tramo.CiudadOrigen.OID.ToString();
                  string hora = tramo.FechaOrigen.Value.ToString("HH:mm");
                  this.txtFechaOrigen.Text = tramo.FechaOrigen.Value.ToShortDateString();
                  this.txtHora.Text = hora;
                  this.txtNroServicioOrigen.Text = tramo.NroServicioOrigen;
                  this.txtCodigoOrigen.Text = tramo.CodigoOrigen;
                  this.txtObservacionOrigen.Text = tramo.ObservacionOrigen;
                  cboCiudadDestino.SelectedValue = tramo.CiudadDestino == null ? "0" : tramo.CiudadDestino.OID.ToString();
                  string horaDestino = tramo.FechaDestino.Value.ToString("HH:mm");
                   this.txtFechaDestino.Text = tramo.FechaDestino.Value.ToShortDateString();
                   this.txtHoraDestino.Text = horaDestino;
                   this.txtObservacionesDestino.Text = tramo.ObservacionDestino;
                   this.txtKmRecorridos.Text = tramo.kmRecorridos.ToString();      
                  UpdatePanel3.Update();
               
                  ScriptManager.RegisterStartupScript(Page, typeof(Page), "Edicion", "Editar();", true);
           }
          
        }
        

        protected void GridTramos_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                ImageButtonExt Borrar = e.Row.FindControl("btnBorrar") as ImageButtonExt;
                if (Borrar != null)
                {
                    Borrar.Settings(new ImageButtonExtDelete());
                }

              ImageButtonExt Editar = e.Row.FindControl("btnEditar") as ImageButtonExt;
                if (Editar != null)
                {
                     
                     Editar.Settings(new ImageButtonExtEdit());
                   
                }
            }

        }
        protected void btnLiquidacion_Click(object sender, EventArgs e)
        {
            string script = @"$(function(){{parent.GenerarLiquidacionFromRendicion('{0}');}});";

            script = string.Format(script, Rendicion.OID.ToString());

            ScriptManager.RegisterStartupScript(Page, typeof(Page), "liquidacion", script, true);


        }

    }
}